package estructuraGrafo;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * Clase Nodo: Esta clase representa al nodo de un grafo
 * 
 * @author  Grupo N11
 * @author  Prinsich Bernz, Emilio J. A.
 * @author 	Solia, Guillermo D.
 * @version  1.0
 */

public class Nodo implements Serializable{

	private static final long serialVersionUID = 1L;
	private String nombre;
	private int tipo; //0 = Acceso Norte; 1 = Salida Sur; != 1 | 0 = Nodo interno
	private ArrayList<Enlace> enlaces; //Listado de enlaces
	private int enlacesExistentes; //cantidad de enlaces
	//private static int cantidad = 0;
	private int numero;
	private int nivel;//Nivel del nodo
	private boolean nivelSet;

	/**
	 * Crea un nuevo nodo
	 * @param newName Nombre del Nodo
	 * @param n Tipo de nodo
	 */
	public Nodo(String newName, int n, int tamanio){
		nombre = newName;
		setTipo(n);
		enlacesExistentes = -1;
		enlaces = new ArrayList<Enlace>();
		numero = tamanio;
		if(n == 0)
			nivel = 1;//Si el nodo Funte por default es el nivel 1
		else
			nivel = -1;
		nivelSet = true;
	}


	public int getEnlacesExistentes(){
		return enlacesExistentes;
	}

	public ArrayList<Enlace> getEnlaces(){
		return enlaces;
	}

	public String getNombre(){
		return nombre;
	}

	public void setNombre(String nombre){
		this.nombre = nombre;
	}
	public int getNumero(){
		return numero;
	}
	
	/**
	 * Agrega un enlace entre este nodo y otro nodo
	 * @param enlazar
	 * 		Nombre del nodo a enlazar
	 * @param nombre2
	 * 		Nombre del enlace
	 * @param distancia
	 * @param costo
	 * @param caudal
	 * @param estado
	 */
	public void agregarEnlace(String enlazar,String nombre2, double distancia, float costo, int caudal, boolean estado)	{
		if (enlacesExistentes == -1){
			enlaces.add(new Enlace(enlazar, nombre2, distancia, costo, caudal, estado));
			enlacesExistentes++;
		}
		else{
			int posicion;
			posicion = existeEnlace(enlazar);
			if (posicion == -1){
				enlaces.add(new Enlace(enlazar, nombre2, distancia, costo, caudal, estado));
				enlacesExistentes++;
			}
		}
	}

	/**
	 * Verifica que exista un enlace y retorna su posicion, de los contrario retrona -1
	 * @param enlazar
	 * 		Nombre del enlace buscado
	 * @return
	 * 		Posicicon del enlace
	 */
	public int existeEnlace(String enlazar){
		for (int i = 0; i < enlaces.size(); i++){
			Enlace miEnlace;
			miEnlace = enlaces.get(i);
			if (miEnlace.getDestino().equals(enlazar))
				return i;
		}
		return -1;
	}

	/**
	 * retorna la distacia (peso) de un enlace
	 * @param posi Posicion del enlace
	 * @return Distancia (peso)
	 */
	public double enlacePosicion(int posi){
		Enlace miEnlace;
		miEnlace = enlaces.get(posi);
		return miEnlace.getDistancia();
	}

	/**
	 * Retorna el detino de un enlace
	 * @param posi Posicion del enlace
	 * @return String con el destino del nodo
	 */
	public String NodoPosicion(int posi){
		Enlace miEnlace;
		miEnlace = enlaces.get(posi);
		return miEnlace.getDestino();
	}

	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	public int getTipo() {
		return tipo;
	}


	public void setNivel(int nivel) {
		if(nivelSet){
			this.nivel = nivel;
			nivelSet = false;
		} 
	}


	public int getNivel() {
		return nivel;
	}
}